/*
 * Licensed to ObjectStyle LLC under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ObjectStyle LLC licenses
 * this file to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package io.bootique.jackson;

import com.fasterxml.jackson.databind.jsontype.NamedType;
import com.fasterxml.jackson.databind.jsontype.impl.StdSubtypeResolver;


/**
 * A hack that allows to prevent modifications to SubtypeResolver outside the initialization code.
 *
 * @since 0.21
 */
class ImmutableSubtypeResolver extends StdSubtypeResolver {

    private boolean locked;

    ImmutableSubtypeResolver(Class<?>... subtypes) {
        registerSubtypes(subtypes);

        // lock the object against further modification
        locked = true;
    }


    @Override
    public void registerSubtypes(Class<?>... classes) {
        if (locked) {
            throw new UnsupportedOperationException("This object is immutable");
        } else {
            super.registerSubtypes(classes);
        }
    }

    @Override
    public void registerSubtypes(NamedType... types) {
        if (locked) {
            throw new UnsupportedOperationException("This object is immutable");
        } else {
            super.registerSubtypes(types);
        }
    }
}
